/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.app.controller;

import com.app.entity.Estado;
import com.app.entity.Log;
import com.app.entity.Movimiento;
import com.app.entity.Rol;
import com.app.entity.Usuario;
import com.app.sessionBeans.EstadoFacade;
import com.app.sessionBeans.LogFacade;
import com.app.sessionBeans.MovimientoFacade;
import com.app.sessionBeans.UsuarioFacade;
import com.web.app.util.JsfUtil;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Locale;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.context.Flash;
import javax.faces.event.AjaxBehaviorEvent;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;

/**
 *
 * @author EduardoAlexis
 */
@Named(value = "usuarioController")
@SessionScoped
public class UsuarioController implements Serializable {

    @EJB
    private UsuarioFacade usuarioFacade;
    @EJB 
    private EstadoFacade estadoFacade;
    @EJB 
    private MovimientoFacade movimientoFacade;
    @EJB
    private LogFacade logFacade;
    @Inject
    RolController rolController;

    private String usuario;
    private Usuario selected;
    private String pass;
    private String newPass;
    private String dvPass;
    private int badgeGrey = 0;
    private int badgePurpura = 0;
    private int badgeVerde = 0;
   private String mensajeInicial = null;
   private String restoMensaje = "¿ Por donde empiezas hoy ?";
    private List<Usuario> items = null;
    private Usuario currentUsuario = null;
    private boolean visible;
    private String varWelcomeAdmin = "usuarios";

    public UsuarioController() {
    }

    public String getMensajeInicial() {
        if (mensajeInicial==null){
        mensajeInicial= "HOLA "+ usuario.toUpperCase();
        }
        return mensajeInicial;
    }

    public void setMensajeInicial(String mensajeInicial) {
        this.mensajeInicial = mensajeInicial;
    }

    public String getRestoMensaje() {
        return restoMensaje;
    }

    public void setRestoMensaje(String restoMensaje) {
        this.restoMensaje = restoMensaje;
    }

    
    public Usuario getSelected() {
        return selected;
    }

    public void setSelected(Usuario selected) {
        this.selected = selected;
    }

    public Usuario getCurrent() {
        if (currentUsuario == null) {
            currentUsuario = new Usuario(); 
            currentUsuario = getUsuarioFacade().findUsuarioByUsername(getUsuario());
         
        }
        return currentUsuario;
    }

    public void setCurrent(Usuario currentUsuario) {
        this.currentUsuario = currentUsuario;
    }

    public String getVarWelcomeAdmin() {
        return varWelcomeAdmin;
    }

    public void setVarWelcomeAdmin(String varWelcomeAdmin) {
        this.varWelcomeAdmin = varWelcomeAdmin;
    }

    public void setVisible(boolean visible) {
        this.visible = visible;
    }

    public boolean getVisible() {
        return this.visible;
    }

    public void onBeforeShowDialog(AjaxBehaviorEvent event) {
        visible = true;
    }

    public void onBeforeHideDialog(AjaxBehaviorEvent event) {
        visible = false;
    }

    public UsuarioFacade getUsuarioFacade() {
        return usuarioFacade;
    }

    public List<Usuario> getItems() {
        if (items == null) {

            // no tiene que encontrarlos a todos   
            items = getUsuarioFacade().usuariosActivos(getUsuario());
        }
        return items;
    }

    public void setItems(List<Usuario> items) {
        this.items = items;
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    public String getPass() {
        return pass;
    }

    public void setPass(String pass) {
        this.pass = pass;
    }

    public String getNewPass() {
        return newPass;
    }

    public void setNewPass(String newPass) {
        this.newPass = newPass;
    }

    public String getDvPass() {
        return dvPass;
    }

    public void setDvPass(String dvPass) {
        this.dvPass = dvPass;
    }

    public int getBadgeGrey() {
        return badgeGrey;
    }

    public void setBadgeGrey(int badgeGrey) {
        this.badgeGrey = badgeGrey;
    }

    public int getBadgePurpura() {
        return badgePurpura;
    }

    public void setBadgePurpura(int badgePurpura) {
        this.badgePurpura = badgePurpura;
    }

    public int getBadgeVerde() {
        return badgeVerde;
    }

    public void setBadgeVerde(int badgeVerde) {
        this.badgeVerde = badgeVerde;
    }

    public String login() {

        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) context
                .getExternalContext().getRequest();
        try {
            request.login(usuario, pass);

        } catch (ServletException e) {

            FacesContext facesContext = FacesContext.getCurrentInstance();
            Flash flash = facesContext.getExternalContext().getFlash();
            flash.setKeepMessages(true);
            flash.setRedirect(true);
            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Usuario y/o password incorrectos!", null));
            return "login";
        }

        if (request.isUserInRole("administrador")) {

//            FacesContext facesContext = FacesContext.getCurrentInstance();
//            Flash flash = facesContext.getExternalContext().getFlash();
//            flash.setKeepMessages(true);
//            flash.setRedirect(true);
//            facesContext.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "HOLA " + usuario.toUpperCase() + "!", "¿ Por donde empiezas hoy ?"));
             
            return "welcomeAdmin";
        } else if (request.isUserInRole("vendedor")) {

            return "login";
        } else {

            return "login";
        }

    }

    public String logout() {
        String result = "login";

        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest();

        try {
            request.logout();
            setCurrent(null);
            setUsuario(null);
            setMensajeInicial(null);
            setItems(null);
            
        } catch (ServletException e) {
            //    log.log(Level.SEVERE, "Failed to logout user!", e);  

            result = "login";

        }

        return result;
    }

    public void goThereListener() {

        String value = FacesContext.getCurrentInstance().
                getExternalContext().getRequestParameterMap().get("choose");
        switch (value) {
            case "usuarios":
                System.out.println("presiono usuarios");
                setVarWelcomeAdmin("usuarios");
                break;

            case "productos":
                System.out.println("presiono productos");
                setVarWelcomeAdmin("productos");
                System.out.println(getVarWelcomeAdmin());

                break;
            case "ventas":
                System.out.println("presiono ventas");
                setVarWelcomeAdmin("ventas");
                break;
            case "dashboard":
                System.out.println("presiono dashboard");
                setVarWelcomeAdmin("dashboard");
                break;
        }

    }

    public String inicioAdmin() {
        int max = 2;
        int min = 1;
        Random rand = new Random();
        int randomNum = rand.nextInt((max - min) + 1) + min;
//        FacesContext facesContext = FacesContext.getCurrentInstance();
//        Flash flash = facesContext.getExternalContext().getFlash();
//        flash.setKeepMessages(true);
//        flash.setRedirect(true);
        switch (randomNum) {
            case 1:
                 setMensajeInicial("TIP"); 
                 setRestoMensaje("Para salir del sistema, pulsa el botón '" + usuario + "' y luego selecciona la opción 'LogOut'");
                break;
            case 2:
                setMensajeInicial("TIP"); 
                setRestoMensaje("Selecciona una actividad y luego pulsa el botón 'Comenzar' para iniciar tu trabajo.");
                break;

        }
        return "welcomeAdmin";
    }

    public String listarUsuarios() {

        selected = null;
        return "usuarios";
    }

   
    
    public String goMovimientos() {

        return "goMovimientos";
    }

    public String goProfile() {

        return "goProfile";
    }

    public String prepareCreate() {

        selected = new Usuario();
        rolController.setSelected(new Rol());
        return "goToCreate";
    }
    
    
       public String create (){
        persistenciaUsuario(selected, "El usuario se ha creado correctamente");
        if(!JsfUtil.isValidationFailed()){
          items = null;
         selected = new Usuario();
         rolController.setSelected(new Rol());
         FacesContext facesContext = FacesContext.getCurrentInstance();
             Flash flash = facesContext.getExternalContext().getFlash();
             flash.setKeepMessages(true);
             flash.setRedirect(true);
             
        return "goToCreate";
        }
        return null;
    }
    
    
    
    
     public String cadenaMd5 (String pass){
    
        try {
            String clave = pass;
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(clave.getBytes("UTF-8"), 0, clave.length());
            byte[] bt = md.digest();
            BigInteger bi = new BigInteger(1, bt);
            String md5 = bi.toString(16);
            return md5;
            
        
        } catch (NoSuchAlgorithmException | UnsupportedEncodingException ex) {
            Logger.getLogger(UsuarioController.class.getName()).log(Level.SEVERE, null, ex);
            JsfUtil.addErrorMessage(ex, "Lo sentimos ha ocurrido un error inesperado!");
            return null;
        } 
    
    
    }
    
    
        public void persistenciaUsuario (Usuario user,String msg){
        FacesContext context = FacesContext.getCurrentInstance(); 
        
        Usuario userAux = getUsuarioFacade().findUsuarioByUsername(user.getUsername());
       
        Estado estAux = estadoFacade.find(1);
        
        System.out.println("El estado es "+estAux.getDescripcion()+estAux.getIdEstado());
        user.setIdEstado(estAux);
        System.out.println("el valor de selected es "+user.getIdEstado());
        
        if (userAux==null ){
        userAux = new Usuario();
        userAux.setPass(cadenaMd5(user.getPass()));
        System.out.println("pass"+userAux.getPass());
        userAux.setApellido(user.getApellido());
            System.out.println("apellido"+userAux.getApellido());
        userAux.setNombre(user.getNombre());
        userAux.setMail(user.getMail());
            System.out.println("nombre"+userAux.getNombre());
        userAux.setUsername(user.getUsername());
            System.out.println("usuario"+userAux.getUsername());
          userAux.setIdRol(rolController.getSelected());
         System.out.println("rol id"+rolController.getSelected().getIdRol());
          userAux.setIdEstado(user.getIdEstado());
          System.out.println("estado"+userAux.getIdEstado());

        
        // para persistir en logMov
        Usuario usuarioEnSession = getUsuarioFacade().findUsuarioByUsername(usuario);
        
        
        // ahora creo un objeto de tipo LogMov
        
        Log log = new Log();
      
        log.setIdMovimiento(movimientoFacade.find(1));
        log.setIdUsuario(usuarioEnSession);
       // rescato las fecha y hora del sistema  
        
        Calendar fecha = new GregorianCalendar();
        int año = fecha.get(Calendar.YEAR);
        int mes = fecha.get(Calendar.MONTH);
        int dia = fecha.get(Calendar.DAY_OF_MONTH);
        int hora = fecha.get(Calendar.HOUR_OF_DAY);
        int minuto = fecha.get(Calendar.MINUTE);
        int segundo = fecha.get(Calendar.SECOND);
        String fechaSistema = dia+"/"+(mes+1)+"/"+año; 
       String horaSistema = hora+":"+minuto+":"+segundo;
     
      SimpleDateFormat formatoDelTexto1 = new SimpleDateFormat("dd/MM/yyyy",new Locale("es", "ES"));
       SimpleDateFormat formatoDelTexto2 = new SimpleDateFormat("hh:mm:ss");
     
      Date fechaActual = null;
      Date horaActual = null;
            try {
                fechaActual = formatoDelTexto1.parse(fechaSistema);
                horaActual  = formatoDelTexto2.parse(horaSistema);
                log.setFecha(fechaActual);
                log.setHora(horaActual);
             
            } catch (ParseException ex) {
                Logger.getLogger(UsuarioController.class.getName()).log(Level.SEVERE, null, ex);
            }
     
           log.setDetalle("Agregó nuevo usuario: "+userAux.getUsername()); 
      
            try {
                if(userAux.getPass()!=null){
                getUsuarioFacade().create(userAux);
                logFacade.create(log);
                JsfUtil.addSuccessMessage(msg);
                }else{JsfUtil.addErrorMessage("Error en la encriptacion de password!");}
            } catch (Exception e) {
                JsfUtil.addErrorMessage("Error al intentar crear un usuario!");
            }
        
        }else{JsfUtil.addErrorMessage("El usuario "+userAux.getUsername()+" ya existe o ya fue ocupado anteriormente!");}
        
        }

}
